package com.learn.prototype;

import com.learn.prototype.deep.DeepClub;
import com.learn.prototype.deep.DeepMonkey;
import com.learn.prototype.protoyype.*;
import com.learn.prototype.shallow.Club;
import com.learn.prototype.shallow.Monkey;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

/**
 * <p>项目名称: design-pattern </p>
 *
 * <p>文件名称: App </p>
 */
@Slf4j
public class App {

    public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {

        log.info("--------------------------浅克隆-------------------------------");
        Monkey monkey = new Monkey();
        Club club = new Club();
        club.setName("金箍棒");
        monkey.setName("孙悟空");
        monkey.setAge(1000);
        monkey.setClub(club);

        Monkey monkey2 = monkey.clone();

        // 对象本身
        log.info("对象本身:monkey= {},monkey2= {},是否相同：{}",
                monkey,monkey2,monkey.equals(monkey2));
        // 对象属性未序列化
        log.info("对象属性未序列化:monkey.name= {},monkey2.name= {},是否相同：{}",
                monkey.getName(),monkey2.getName(),monkey.getName().equals(monkey2.getName()));
        // 基础数据类型
        log.info("基础数据类型:monkey.age= {},monkey2.age= {},是否相同：{}",
                monkey.getAge(),monkey2.getAge(),monkey.getAge() == monkey2.getAge());
        // 对象属性序列化
        log.info("对象属性序列化:monkey.club= {},monkey2.club= {},是否相同：{}",
                monkey.getClub(),monkey2.getClub(),monkey.getClub().equals(monkey2.getClub()));


        log.info("--------------------------深克隆-------------------------------");

        DeepMonkey deepMonkey = new DeepMonkey();
        DeepClub deepClub = new DeepClub();
        club.setName("金箍棒");
        deepMonkey.setName("孙悟空");
        deepMonkey.setAge(1000);
        deepMonkey.setClub(deepClub);

        DeepMonkey deepMonkey2 = deepMonkey.deepClone();
        // 对象本身
        log.info("对象本身：deepMonkey= {},deepMonkey2= {},是否相同：{}",
                deepMonkey,deepMonkey2,deepMonkey.equals(deepMonkey2));
        // 对象属性未序列化
        log.info("对象属性未序列化：deepMonkey.name= {},deepMonkey2.name= {},是否相同：{}",
                deepMonkey.getName(),deepMonkey2.getName(),deepMonkey.getName().equals(deepMonkey2.getName()));
        // 基础数据类型
        log.info("基础数据类型：deepMonkey.age= {},deepMonkey2.age= {},是否相同：{}",
                deepMonkey.getAge(),deepMonkey2.getAge(),deepMonkey.getAge() == deepMonkey2.getAge());
        // 对象属性序列化
        log.info("对象属性序列化：deepMonkey.club= {},deepMonkey2.club= {},是否相同：{}",
                deepMonkey.getClub(),deepMonkey2.getClub(),deepMonkey.getClub().equals(deepMonkey2.getClub()));


        log.info("--------------------------原型模式-------------------------------");
        FactoryImpl factory = new FactoryImpl(new ElTable("test"),new ElLine("test-line"));
        Table table = factory.createTable();
        Line line = factory.createLine();
        log.info("原始数据地址：{}，复制的数据地址：{}，原始数据值：{}，复制的数据值：{}",
                factory.getTable(),table,factory.getTable().getName(),table.getName());
        log.info("原始数据地址：{}，复制的数据地址：{}，原始数据值：{}，复制的数据值：{}",
                factory.getLine(),line,factory.getLine().getName(),line.getName());

        table.setName("tt");
        log.info("原始数据地址：{}，复制的数据地址：{}，原始数据值：{}，复制的数据值：{}",
                factory.getTable(),table,factory.getTable().getName(),table.getName());
    }
}
